/*
 * @(#)InvocationFuture.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.nhncorp.usf.core.invoker;

/**
 * @author Web Platform Development Team
 */
public interface InvocationFuture {

	/**
	 * InvocationFuture값이 결과값을 받았을떄, 바로 수행하는 동작을 정의합니다.
	 * addListener의 순서에 따라 실행순서가 결정됩니다. 
	 * 
	 * @param listener 수행할 동작
	 * 
	 * @return listener가 등록되는 InvocationFuture 객체를 return합니다.
	 */
	InvocationFuture addListener(InvocationFutureListener listener);

	/**
	 * InvocationFuture에 등록되어 있는 listener를 삭제합니다.
	 * 
	 * @param listener 삭제할 listenr
	 * 
	 * @return listenr를 포함하고 있던 InvocationFuture객체를 return합니다.
	 */
	InvocationFuture removeListener(InvocationFutureListener listener);

	/**
	 * invoke한 결과를 받기 위해 기다립니다.
	 * 
	 * @return await를 하고 있는 invocationFuture객체를 return합니다.
	 * 
	 * @throws InterruptedException await중 작업을 종료시킬 경우 exception발생합니다.
	 */
	InvocationFuture await() throws InterruptedException;

	/**
	 * invoke한 결과를 받기 위해 기다립니다.
	 * await중 작업을 종료시킬 경우 무시합니다.
	 * 
	 * @return await를 하고 있는 invocationFuture객체를 return합니다.
	 */
	InvocationFuture awaitUninterruptibly();

	/**
	 * Checks if is ready.
	 * 
	 * @return true, if is ready
	 */
	boolean isReady();

	/**
	 * Gets the return value.
	 * 
	 * @return the return value
	 * 
	 * @throws Exception the exception
	 */
	Object getReturnValue() throws Exception;

	/**
	 * Gets the exception.
	 * 
	 * @return the exception
	 */
	Exception getException();
}
